package service

import (
	"errors"
	"github.com/tjfoc/gmsm/sm4"
)

// RequestEncryptParams 加密接口请求的参数
type RequestEncryptParams struct {
	Data []string `form:"data" json:"data" binding:"required"`
}

// EncryptData 加密后数据
type EncryptData struct {
	Data [][]byte `json:"data"`
}

// DecryptData 解密后数据
type DecryptData struct {
	Data []string `json:"data"`
}

// EncryptAndDecrypt 加解密接口
type EncryptAndDecrypt interface {
	Encrypt(key, msg []byte) ([]byte, error)
	Decrypt(key, msg []byte) ([]byte, error)
}

// Sm4 实现EncryptAndDecrypt接口
type Sm4 struct {
}

var (
	//TODO 上线时修改此处
	sm4Key = []byte("1234567890abcdef")
)

// Encrypt
// @description: 统一加密接口
// @param: req 加密接口请求的参数
// @param: ead 加密方式
// @author: GJing
// @email: gjing1st@gmail.com
// @date: 2022/1/11 10:22
// @success:
func Encrypt(req RequestEncryptParams, ead EncryptAndDecrypt) (res EncryptData, err error) {
	length := len(req.Data)
	if length <= 0 {
		return res, errors.New("待加密数据不能为空")
	}
	res.Data = make([][]byte, length)
	for i, e := range req.Data {
		cbc, err := ead.Encrypt(sm4Key, []byte(e))
		if err != nil {
			return res, err
		}
		res.Data[i] = cbc
	}
	return
}

// Encrypt
// @description: sm4加密
// @param: key 密钥
// @param: msg 需要加密的数据
// @author: GJing
// @email: gjing1st@gmail.com
// @date: 2022/1/11 10:11
// @success:
func (s4 *Sm4) Encrypt(key, msg []byte) (cbc []byte, err error) {
	cbc, err = sm4.Sm4Cbc(key, msg, true)
	return
}

// Decrypt
// @description: sm4解密
// @param: key 密钥
// @param: msg 加密后的数据
// @author: GJing
// @email: gjing1st@gmail.com
// @date: 2022/1/11 10:10
// @success:
func (s4 *Sm4) Decrypt(key, msg []byte) (cbc []byte, err error) {
	cbc, err = sm4.Sm4Cbc(key, msg, false)
	return
}
